package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.OrdenCompraDTO;
import co.inventario.entidad.InsumoDTO;
import co.inventario.entidad.OrdenCompraInsumoDTO;

public class OrdenCompraInsumoDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public OrdenCompraInsumoDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(OrdenCompraInsumoDTO ordenCompraInsumoDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO OrdenCompra_Insumo (In_Consecutivo_Orden_Insumo, In_Codigo_Orden, In_Codigo_Insumo, Dc_Cantidad_OrdenInsumo, Mn_Costo_OrdenInsumo) VALUE (?, ?, ?, ?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setInt(1, ordenCompraInsumoDTO.getInConsecutivoOrdenInsumo());
			preparedStatement.setInt(2, ordenCompraInsumoDTO.getOrdenCompraDTO().getInCodigoOrden());
			preparedStatement.setInt(3, ordenCompraInsumoDTO.getInsumoDTO().getInCodigoInsumo());
			preparedStatement.setDouble(4, ordenCompraInsumoDTO.getDcCantidadOrdenInsumo());
			preparedStatement.setDouble(5, ordenCompraInsumoDTO.getMnCostoOrdenInsumo());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creandola orden de compra insumo: " + exception.getMessage());
		}
	}

	public void actualizar(OrdenCompraInsumoDTO ordenCompraInsumoDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE OrdenCompra_Insumo SET In_Codigo_Orden = ISNULL(?, In_Codigo_Orden), In_Codigo_Insumo = ISNULL(?, In_Codigo_Insumo), Dc_Cantidad_OrdenInsumo = ISNULL(?, Dc_Cantidad_OrdenInsumo), Mn_Costo_OrdenInsumo = ISNULL(?, Mn_Costo_OrdenInsumo) WHERE In_Codigo_Orden_Insumo = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setInt(1, ordenCompraInsumoDTO.getOrdenCompraDTO().getInCodigoOrden());
			preparedStatement.setInt(2, ordenCompraInsumoDTO.getInsumoDTO().getInCodigoInsumo());
			preparedStatement.setDouble(3, ordenCompraInsumoDTO.getDcCantidadOrdenInsumo());
			preparedStatement.setDouble(4, ordenCompraInsumoDTO.getMnCostoOrdenInsumo());
			preparedStatement.setInt(5, ordenCompraInsumoDTO.getInCodigoOrdenInsumo());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando la orden de compra insumo: " + exception.getMessage());
		}
	}

	public OrdenCompraInsumoDTO consultarPorCodigo(OrdenCompraInsumoDTO ordenCompraInsumoDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM OrdenCompra_Insumo WHERE In_Codigo_Orden_Insumo = ?";
		OrdenCompraInsumoDTO ordenCompraInsumoDTOResultado = null;
		OrdenCompraDTO ordenCompraDTO = null;
		InsumoDTO insumoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, ordenCompraInsumoDTO.getInCodigoOrdenInsumo());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				ordenCompraInsumoDTOResultado = new OrdenCompraInsumoDTO();
				ordenCompraInsumoDTOResultado.setInCodigoOrdenInsumo(resultSet.getInt("In_Codigo_Orden_Insumo"));
				ordenCompraInsumoDTOResultado.setInConsecutivoOrdenInsumo(resultSet.getInt("In_Consecutivo_Orden_Insumo"));
				ordenCompraDTO = new OrdenCompraDTO();
				ordenCompraDTO.setInCodigoOrden(resultSet.getInt("In_Codigo_Orden"));
				ordenCompraInsumoDTOResultado.setOrdenCompraDTO(ordenCompraDTO);
				insumoDTO = new InsumoDTO();
				insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
				ordenCompraInsumoDTOResultado.setInsumoDTO(insumoDTO);
				ordenCompraInsumoDTOResultado.setDcCantidadOrdenInsumo(resultSet.getDouble("Dc_Cantidad_OrdenInsumo"));
				ordenCompraInsumoDTOResultado.setMnCostoOrdenInsumo(resultSet.getDouble("Mn_Costo_OrdenInsumo"));
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la orden de compra insumo a traves del codigo: " + exception.getMessage());
		}
		return ordenCompraInsumoDTOResultado;
	}

	public OrdenCompraInsumoDTO consultarPorConsecutivo(OrdenCompraInsumoDTO ordenCompraInsumoDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM OrdenCompra_Insumo WHERE In_Consecutivo_Orden_Insumo = ?";
		OrdenCompraInsumoDTO ordenCompraInsumoDTOResultado = null;
		OrdenCompraDTO ordenCompraDTO = null;
		InsumoDTO insumoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, ordenCompraInsumoDTO.getInConsecutivoOrdenInsumo());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				if (resultSet.next()) {
					ordenCompraInsumoDTOResultado = new OrdenCompraInsumoDTO();
					ordenCompraInsumoDTOResultado.setInCodigoOrdenInsumo(resultSet.getInt("In_Codigo_Orden_Insumo"));
					ordenCompraInsumoDTOResultado.setInConsecutivoOrdenInsumo(resultSet.getInt("In_Consecutivo_Orden_Insumo"));
					ordenCompraDTO = new OrdenCompraDTO();
					ordenCompraDTO.setInCodigoOrden(resultSet.getInt("In_Codigo_Orden"));
					ordenCompraInsumoDTOResultado.setOrdenCompraDTO(ordenCompraDTO);
					insumoDTO = new InsumoDTO();
					insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
					ordenCompraInsumoDTOResultado.setInsumoDTO(insumoDTO);
					ordenCompraInsumoDTOResultado.setDcCantidadOrdenInsumo(resultSet.getDouble("Dc_Cantidad_OrdenInsumo"));
					ordenCompraInsumoDTOResultado.setMnCostoOrdenInsumo(resultSet.getDouble("Mn_Costo_OrdenInsumo"));
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la orden de compra insumo a traves del consecutivo: " + exception.getMessage());
		}
		return ordenCompraInsumoDTOResultado;
	}

	public ArrayList<OrdenCompraInsumoDTO> consultarPorCodigoOrden(OrdenCompraInsumoDTO ordenCompraInsumoDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM OrdenCompra_Insumo WHERE In_Codigo_Orden = ?";
		OrdenCompraInsumoDTO ordenCompraInsumoDTOResultado = null;
		ArrayList<OrdenCompraInsumoDTO> ordenCompraInsumoDTOLista = new ArrayList<OrdenCompraInsumoDTO>();
		OrdenCompraDTO ordenCompraDTO = null;
		InsumoDTO insumoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, ordenCompraInsumoDTO.getOrdenCompraDTO().getInCodigoOrden());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next()) {
					ordenCompraInsumoDTOResultado = new OrdenCompraInsumoDTO();
					ordenCompraInsumoDTOResultado.setInCodigoOrdenInsumo(resultSet.getInt("In_Codigo_Orden_Insumo"));
					ordenCompraInsumoDTOResultado.setInConsecutivoOrdenInsumo(resultSet.getInt("In_Consecutivo_Orden_Insumo"));
					ordenCompraDTO = new OrdenCompraDTO();
					ordenCompraDTO.setInCodigoOrden(resultSet.getInt("In_Codigo_Orden"));
					ordenCompraInsumoDTOResultado.setOrdenCompraDTO(ordenCompraDTO);
					insumoDTO = new InsumoDTO();
					insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
					ordenCompraInsumoDTOResultado.setInsumoDTO(insumoDTO);
					ordenCompraInsumoDTOResultado.setDcCantidadOrdenInsumo(resultSet.getDouble("Dc_Cantidad_OrdenInsumo"));
					ordenCompraInsumoDTOResultado.setMnCostoOrdenInsumo(resultSet.getDouble("Mn_Costo_OrdenInsumo"));
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la orden de compra insumo a traves del codigo de la orden: " + exception.getMessage());
		}
		return ordenCompraInsumoDTOLista;
	}

	public ArrayList<OrdenCompraInsumoDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM OrdenCompra_Insumo";
		OrdenCompraInsumoDTO ordenCompraInsumoDTOResultado = null;
		ArrayList<OrdenCompraInsumoDTO> ordenCompraInsumoDTOLista = null;
		OrdenCompraDTO ordenCompraDTO = null;
		InsumoDTO insumoDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next()) {
					ordenCompraInsumoDTOResultado = new OrdenCompraInsumoDTO();
					ordenCompraInsumoDTOResultado.setInCodigoOrdenInsumo(resultSet.getInt("In_Codigo_Orden_Insumo"));
					ordenCompraInsumoDTOResultado.setInConsecutivoOrdenInsumo(resultSet.getInt("In_Consecutivo_Orden_Insumo"));
					ordenCompraDTO = new OrdenCompraDTO();
					ordenCompraDTO.setInCodigoOrden(resultSet.getInt("In_Codigo_Orden"));
					ordenCompraInsumoDTOResultado.setOrdenCompraDTO(ordenCompraDTO);
					insumoDTO = new InsumoDTO();
					insumoDTO.setInCodigoInsumo(resultSet.getInt("In_Codigo_Insumo"));
					ordenCompraInsumoDTOResultado.setInsumoDTO(insumoDTO);
					ordenCompraInsumoDTOResultado.setDcCantidadOrdenInsumo(resultSet.getDouble("Dc_Cantidad_OrdenInsumo"));
					ordenCompraInsumoDTOResultado.setMnCostoOrdenInsumo(resultSet.getDouble("Mn_Costo_OrdenInsumo"));
					ordenCompraInsumoDTOLista = new ArrayList<OrdenCompraInsumoDTO>();
					ordenCompraInsumoDTOLista.add(ordenCompraInsumoDTOResultado);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando todas las ordenes de compra insumo: " + exception.getMessage());
		}
		return ordenCompraInsumoDTOLista;
	}
}
